Docker multi-stage builds
Dockerでは、最終的なイメージのサイズをなるべく小さくするのがベストプラクティス
=> Dockerを使うときの考え方
Goなどの言語を使った開発の場合、最終的にビルドしたものさえあれば、ビルド自体に必要な環境は実行時には必要ない
そのため、 ビルドのためのイメージ -> そこから必要ないものを取り除いたイメージ というように複数stageに渡って(複数のDockerfileやシェルスクリプトなどを駆使して)最終的なイメージを作り上げるテクニックがある(あった)
が、複数のDockerfileをメンテするのはツラいし、中間のイメージは容量を食うし、要らんファイルがローカルに残ったりする
multi-stage buildsは、上記テクニックを一つのDockerfileでできるようにする目的で作られた機能(since Docker 17.05)
一つのDockerfileにFROMを複数回書けるようになり、ビルドまでされた(最終的には必要ないものも含まれているいる)中間のイメージをFROMで使える
これにより、余計なイメージやファイルが生成されたり、複数のDockerfileをメンテしなくていいようになった
公式ドキュメントに
It was actually very common to have one Dockerfile to use for development (which contained everything needed to build your application), and a slimmed-down one to use for production, which only contained your application and exactly what was needed to run it.
みたいなことが書いてあったせいで開発環境から本番環境までを一つのDockerfileでいい感じに構築できるのかと思ったが、そういうものではない
Docker Compose with Docker multi-stage builds のようにするとやりたかったことができる
ref.
https://docs.docker.com/engine/userguide/eng-image/multistage-build/
https://blog.alexellis.io/mutli-stage-docker-builds/